Estoy agregando pruebas unitarias a un proyecto php heredado que tiene muchas clases de javascript más antiguas. Especialmente, estoy tratando de escribir pruebas en un archivo que se encuentra en el directorio ./public/scripts/.
El Javascript parece que es es4 o 5.
Agregué npm package.json babel, mocah y chai al proyecto.
Sigo recibiendo el siguiente error cuando ejecuto las pruebas. Error [ERR_MODULE_NOT_FOUND]: Cannot find module '~/Development/web/OHB/dev/public/script/world' imported from ~/Development/web/OHB/dev/tests/js/world.test.js
Mi paquete.json se ve así.
{ "name": "ohb", "version": "0.0.0", "type": "module", "main": "./public/script/main.js", "description": "package management for the javascript application that configures the building configurator", "scripts": { "test": "npx mocha \"./tests/js/*.test.js\" --recursive --require @babel/register" }, "devDependencies": { "@babel/core": "^7.15.5", "@babel/preset-env": "^7.15.6", "@babel/register": "^7.15.3", "chai": "^4.3.4", "mocha": "^9.1.2" } }El archivo javascript que intento probar está en /public/scripts/world.js y tiene este aspecto.
import * as THREE from "../../../build/three.module.js"; import {OHBBuilding, focuspoint} from "/script/bap/building.js"; import {OrbitControls} from "/assets/js/OrbitControls.js"; export var container; export var camera, scene, renderer; export var groundMaterial, barn, controls; export var loaded3d = false; var canexpand=true; var builder; export var objects = [], plane; var raycaster = new THREE.Raycaster(); var mouse = new THREE.Vector2(), SELECTED= new THREE.Vector3(); function myTestFunction() { return {}; } ///lots of other functions below here module.exports = { myTestFunction };mi prueba se ve así
import { expect } from "chai"; import { myTestFunction } from "../../public/script/world"; describe('myTestFunction - does it return an object', () => { it('returns an empty object', () => { const expected = {}; const actual = myTestFunction(); expect(expected).to.deep.equal(actual); }); });este es un poco complicado, así que permítanme dividirlo en dos partes:
Hay un mensaje que indica que no se puede encontrar el módulo porque no ha especificado la extensión. Si reemplaza la segunda línea en su prueba para:
import { myTestFunction } from "../../public/script/world.js"; se encontrará el módulo. Sucede porque node.js no infiere la extensión del archivo. Esto se puede cambiar fácilmente agregando un argumento --es-module-specifier-resolution=node a su comando mocha:
npx mocha \"./tests/js/*.test.js\" --recursive --require @babel/register --es-module-specifier-resolution=nodeHay documentación de node.js al respecto, aunque es una lectura bastante larga.
Después de que tenga su archivo world.js visible desde el archivo de prueba, obtendrá otro error:
ReferenceError: module is not defined in ES module scope This file is being treated as an ES module because it has a '.js' file extension and '/root/stack-overflow/mocha-help/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.Tienes dos formas de lidiar con eso:
world.js a la nueva sintaxis del módulo ES: export { myTestFunction };world.cjs y hacer referencia a esa extensión en el archivo de prueba.Realmente no hay diferencia en ambos, por lo que se reduce a qué opción será más fácil de implementar.